package log

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
	"io"
	"os"
	"path/filepath"
	"runtime"
	"time"
)

// 全局 Logrus 实例
var logger = logrus.New()

// 初始化 Logrus 并配置日志切割
func InitLog(logDir string, logName string) {

	// 1. 配置日志切割（lumberjack）
	logWriter := &lumberjack.Logger{
		Filename:   getLogFilePath(logDir, logName), // 日志文件路径
		MaxSize:    200,                             // 单个文件最大 10MB
		MaxBackups: 300,                             // 最多保留 30 个备份文件
		MaxAge:     7,                               // 日志文件保留 7 天
		Compress:   false,                           // 压缩备份文件（.gz）
	}

	// 2. 配置 Logrus 输出目标和格式
	multiWriter := io.MultiWriter(os.Stdout, logWriter)
	logger.SetOutput(multiWriter)
	//logrus.SetFormatter(&logrus.JSONFormatter{
	//	TimestampFormat: "2006-01-02 15:04:05.000", // 时间格式（毫秒级）
	//	PrettyPrint:     false,                     // 生产环境关闭美化输出
	//})

	logger.SetFormatter(&logrus.TextFormatter{
		ForceColors:     true,                      // 终端输出时启用颜色
		FullTimestamp:   true,                      // 显示完整时间
		TimestampFormat: "2006-01-02 15:04:05.000", // 时间格式（精确到毫秒）
		DisableQuote:    true,                      // 不引用字段值
		CallerPrettyfier: func(f *runtime.Frame) (string, string) {
			// 简化文件名（只保留最后一段）
			filename := filepath.Base(f.File)
			// 格式：文件名:行号
			return "", fmt.Sprintf(" %s:%d", filename, f.Line)
		},
		FieldMap: logrus.FieldMap{ // 自定义字段名（可选）
			logrus.FieldKeyTime:  "time",
			logrus.FieldKeyFile:  "file",
			logrus.FieldKeyFunc:  "func",
			logrus.FieldKeyLevel: "level",
			logrus.FieldKeyMsg:   "message",
		},
	})

	// 3. 设置日志级别（debug < info < warn < error < fatal < panic）
	// 生产环境建议使用 logrus.InfoLevel
	logger.SetLevel(logrus.DebugLevel)

	// 4. 可选：添加调用者信息（文件名和行号）
	logger.SetReportCaller(false)
}

// 获取日志文件路径（按日期创建目录）
func getLogFilePath(logDir string, logName string) string {
	// 日志根目录
	logRoot := logDir
	// 按日期创建子目录（如 logs/2024-10-22/）
	dateDir := time.Now().Format("20060102")
	// 日志文件名（主日志文件为 app.log）
	fileName := dateDir + "." + logName
	// 完整路径：./logs/2024-10-22/app.log
	return filepath.Join(logRoot, fileName)
}

// 提供给 Hertz 框架的日志实例
func GetHertzLogger() *LogrusAdapter {
	return &LogrusAdapter{logger}
}
